package com.woniuxy.email;

import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @author yellow Docter
 * @date 2024-10-23
 * @desc 蜗牛创想：www.woniuxy.com
 *   测试消息确认机制
 */

@SpringBootTest
public class MQTest04 {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void send01(){
        String exchange = "confirm.exchange1";
        String  key = "woniuxy.gz";
        String msg = "腾讯和蜗牛达成战略学习";

        // 开启消息强制投递
        rabbitTemplate.setMandatory(true);

        //消息确认的回调
        /**
         * 1. correlationData：是用于关联生产者消息和消息确认结果的对象
         * 2. ack：是否被确认，是一个布尔值。
         *    - 当 ack 为 true 时，表示消息已被成功发送到交换机。
         *    - 当 ack 为 false 时，表示消息发送失败或未到达交换机。
         * 3. cause：是一个描述消息发送失败原因的字符串。当 ack 为 false 时，
         * cause 可以提供额外的信息，帮助理解消息发送失败的具体原因。
         */

        rabbitTemplate.convertAndSend(exchange,key, msg);

        rabbitTemplate.setConfirmCallback((correlationData, ack, cause)->{
            System.out.println("消息数据:correlationData = " + correlationData);
            if (ack){
                System.out.println("成到达交换机 = " + correlationData);
            }else{
                System.out.println("消息失败的原因:cause = " + cause);
                //存储到 mysql 晚上 搞定时任务 处理这个发送失败的消息
            }
        });

    }

    @Test
    public void send02(){
        String exchange = "confirm.exchange"; //消息可以到 交换机
//        String  key = "woniuxy.sz";           //路由错误 (到不了队列 )
        String  key = "woniuxy.gz";             //路由正确
        String msg = "腾讯和蜗牛达成战略学习222";

        // 正常测试：为消息指定一个唯一的CorrelationData对象，以便在确认回调时可以关联到具体的消息
        rabbitTemplate.convertAndSend(exchange,key, msg,new CorrelationData("123456"));
    }

}
